#ifndef __CHAT_H_
#define __CHAT_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <pthread.h> //需要在gcc时装载pthread动态库（-lpthread）

#include <sys/stat.h>
#include <fcntl.h>

//基本服务器信息定义
#define PORT 4396
#define NAME_LEN 50
#define MSG_LEN 1000
#define MAX_CLIENTS 20

//客户端状态定义
#define LOGIN 1
#define LOGOUT 2

//消息类型定义
#define PUBLIC 3
#define PRIVATE 4

//传输状态定义
#define OK 5
#define ERROR 6

//用户行为定义
#define ADD 7
#define DEL 8

//错误类型定义
#define FIFO_OPEN_ERR -1
#define FIFO_READ_ERR -2
#define FIFO_WRITE_ERR -3
#define SOCKET_INIT_ERR -4
#define SOCKET_BIND_ERR -5
#define SOCKET_LISTEN_ERR -6
#define SOCKET_ACCEPT_ERR -7
#define SOCKET_CONNECT_ERR -8
#define CONNECTION_REFUSED -9

typedef struct  ClientList  //用户列表数据结构
{
    char name[NAME_LEN];    //用户名
    int socketfd;   //socket fd
} ClientList;

typedef struct Message  //Cli和Ser之间交换的信息结构
{
    int MsgType;    //消息类型（群聊/私发/用户操作）
    char SourceUser[NAME_LEN];  //源用户
    int SourceNum;  //源用户在用户列表中的位置
    int TargetNum;  //目标用户（如有）在用户列表中的位置
    char MsgContent[MSG_LEN];   //消息内容
    ClientList CList[MAX_CLIENTS];  //在线用户列表
} Message;

struct ARG  //这个数据结构用于在服务器的主线程和各个接收线程之间传递数据
{
    int UserNum;    //用户在用户列表中的位置
    int fifofd; //管道标识fd
};

ClientList CList[MAX_CLIENTS];

#endif